<?php
/**
 * Created by PhpStorm.
 * User: huyi
 * Date: 2018/1/24
 * Time: 9:11
 * 参考地址  :  http://blog.csdn.net/demon3182/article/details/77482725
 */
/**
 * 为了说明这种模式，我们将搭建一个简单的日志记录系统。它将包括两段程序–第一个将产生日志消息，第二个将接收并且打印它们。
 * 在我们的日志记录系统中，接收者程序的每个运行副本都会收到消息。这样我们就可以运行一个接收器并将日志指向磁盘，
 * 同时我们可以运行另一个接收器并将日志打印在屏幕上。
 * 基本上，已发布的日志消息将被广播所有接收者。
 * 消息路由到具有 route_key 指定的名称的队列(如果存在)。路由秘钥是 basic_public 的第三个参数。
 */

/**
 * 交换机类型
 * 有几种交换类型可用：direct, topic, headers, fanout. 我们将重点关注最后一个 - fanout. 让我们创建一个种类型的交换，并且将其称为 logs：
 * $channel->exchange_declare('logs', 'fanout', false, false, false);
 * ****
 * ****
 * fanout 交换非常简单。正如你可以从名字猜测的一样，它只是将所有的消息广播到所有已知的队列。这正是我们需要的日志记录器。
 * ****
 * ****
 */

/**
 *  现在，我们可以将消息发布到我们命名的交换机：
 * $channel->exchange_declare('logs', 'fanout', false, false, false);
 * $channel->basic_publish($msg, 'logs');
 */

/**
 * 临时队列
 */
/**
 * 你还记得我们之前使用的是具有指定名称的队列(hello, task_queue)。
 * *
 * 能够给队列命名对我们而言是非常重要的，因为我们需要将消费者指向同一个队列。当你想要在生产者和消费者之间共享队列时，给队列一个名字是很重要的。
 * *
 * 但是对我们现在的****日志记录器****而言却不是这样。我们希望收到所有的日志消息，而不仅仅是它的一部分。我们也只对当前的日志消息感兴趣，
 * 而对之前的老的日志消息不感兴趣。要解决这些问题，我们需要哦解决两件事情。
 * 首先，每当我们连接到RabbitMQ，我们都需要一个新的，空的队列。为止，我们可以创建一个具有随机名称的队列，
 * 或者更好–让我们的服务器生成一个随机名称队列。
 * 其次，一旦我们断开消费者，队列应该被自动删除。
 */

/**
 * 在 php-amqplib 客户端。当我们提供的队列名称为空字符串时，我们会创建一个随机名称的非持久化的队列：
 * list($queue_name, ,) = $channel->queue_declare("");
 * *
 * 当该方法返回时，$queue_name 变量包含由RabbitMQ生成的随机队列名称。例如，它可能看起来像这样 amq.gen-JzTY20BRgKO-HjmUJj0wLg
 */

/**
 * 绑定
 */
/**
 * 我们已经创建了一个fanout交换和一个队列。现在我们需要告诉交换机发送消息到我们的队列。***交换机***和***队列***之间的关系称为绑定。
 * $channel->queue_bind($queue_name, 'logs');
 * *
 * 从现在开始，日志交换器将发送消息到我们的队列。列出绑定项
 * 你可以列出你想要的现有的绑定。
 * rabbitmqctl list_bindings
 */

/**
 * 如果想要将日志保存到文件，只需要打开控制台并且键入：
 * php receive_logs.php > logs_from_rabbit.log
 * 1
 * 如果你希望在屏幕上看到日志，则再打开一个控制台并运行：
 * php receive_logs.php
 * 1
 * 当然，需要生产日志：
 * php emit_log.php
 * 1
 * 使用 rabbitmqctl list_bindings 可以验证实际上根据需要创建的绑定和队列。现在运行了两个receive_log.php 程序，你应该会看到类似下面的的内容：
 * sudo rabbitmqctl list_bindings
 * # => Listing bindings ...
 * # => logs    exchange        amq.gen-JzTY20BRgKO-HjmUJj0wLg  queue           []
 * # => logs    exchange        amq.gen-vso0PVvyiRIL2WoV3i48Yg  queue           []
 * # => ...done.
 * 1
 * 2
 * 3
 * 4
 * 5
 * 对结果的解释很简单：来自交换机日志数据转到具有服务器分配名称的两个队列。这正是我们想要的。
 */